昨天提到了一些 flask 的例子,而今天會繼續深入討論他提供的一些函式,可以讓寫出來的網頁有更多的變化。
首先我們來看個例子,這個網頁裏面包含了數個路徑,我們一一來檢視。
from flask import Flask, redirect, url_for, abort
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
    
@app.route("/google")
def redirect_to_google():
    print("Route 1")
    return redirect("https://google.com")
@app.route("/google2")
def redirect_to_google_2():
    print("Route 2")
    return redirect(url_for("redirect_to_google"))
@app.route("/dont_see")
def dont_see():
    abort(403)
app.run(host="127.0.0.1", port=8080, debug=True)
redirect 這個函式,而我們需要先從 flask import 他。再來要注意的是,並不是單單 redirect(url) 就可以了,前面必須要加上 return。url_for 這個函式,一樣要先 import。在 url_for() 填的參數是要導向的函式名稱,請注意是函式名稱 (字串),而非函式本身,也不是該路徑,如果要看完整對應表的話可以使用 app.url_map。他會找出該函式對應到的路徑,以此處為例,url_for("redirect_to_google") 會回傳 "/google",然後就會變成 return redirect("/google"),然後就會導向到剛剛的第二個路徑。403 Forbidden。這裡使用的是 abort 函式,一樣需要先 import。他很直接,就是會直接回傳指定的 指定的 HTTP status code,但必須要是一個錯誤的 code (404、418、500 等等)。這裡要注意的是,他不需要 return,但他跟 return 一樣,都會直接把後面的程式忽略。有了這個函式,我們可以更輕鬆的處理錯誤。如果不想要直接 abort 還想要有其他回傳東西的話,那可以改用 return "", 404,空字串的部分可以自由改動,flask 會回傳你指定的 HTML 並附加該 HTTP status code。昨天有提到 return 只有某些型別可用,我舉的例子是 str 和 Response,這裡要說明的就是後者。這邊一樣先提供一個範例,它包含了兩個路徑。
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/")
def set_cookie_page():
    response = make_response("meow1")
    response.headers["Content-Type"] = "text/html"
    response.set_cookie("user", "somebody")
    return response
@app.route("/del")
def del_cookie_page():
    response = make_response("meow2")
    response.delete_cookie("user")
    return response
app.run(host="127.0.0.1", port=8080, debug=True)
response 變數,使用到了 make_response 函式,他也需要 import。這個函式的參數基本上就是在前面的例子中 return 的內容,如 redirect、一般的字串、或是未來會提到的 render_template 等等,這邊方便起見就隨便放一個字串。接下來我們可以設定該 response 的標頭,此處用常見的 Content-Type 作為範例,標頭是一個 dict,所以可以直接用此方式更改。再接著我們設定 cookie,使用的是 Response 物件的 set_cookie 函式,第一個參數是 cookie 名稱,第二個參數是 cookie 的值。最後我們傳回這個 response,可以打開開發人員工具來看看是否都有跑出正確的樣子。Response 物件的 delete_cookie 函式,他只需要接 cookie 的名稱就可以刪除。這時候打開瀏覽器看 cookie 應該可以看到 user 欄位已經被清空。這邊可以注意的是,在網路上查有些人會直接 set_cookie("user", expire=0),這樣也是正確的,事實上,delete_cookie 這個函數的實作就是這樣做,只是把它包起來罷了。這邊的 set_cookie 和 delete_cookie 都還有很多參數可以加,像是剛剛的 expire 等等,但就不再這邊多說了,有需要的人可以看一下他的原始碼,註解應該都蠻清楚的。
今天看了一些進階的 flask 函式,有了這些函式可以讓我們能夠更細膩地設計網站。在本篇文章的內容都沒有深入討論該函式的其他用法,如果有興趣的人可以再看看文件及原始碼。
How do I set response headers in Flask?
How to set cookie in Python Flask?